package org.atlantis.grosbeak.pot.mapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;

import org.atlantis.grosbeak.lang.Exceptions;
import org.atlantis.grosbeak.pot.PotException;

/**
 * 把数据库中查询出来的数据映射到一个POJO对象中。<br>
 * 注：POJO对象中的属性名与数据库表中的字段名通过mapping方法匹配。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 */
public abstract class EntityRowMapper<T> extends PojoRowMapper<T> {

	@SuppressWarnings("unchecked")
	@Override
	public T mapRow(ResultSet rs, String[] names, int[] types)
			throws SQLException {
		try {
			T pojo = (T) clazz.newInstance();
			for (int i = 0; i < names.length; i++) {
				PropertyMapper pm = map.get(oppo().get(names[i]));
				if (pm != null) {
					Object arg = pm.mapper.mapField(rs, types[i], names[i],
							pm.nullable);
					pm.method.invoke(pojo, arg);
				}
			}
			return pojo;
		} catch (Exception e) {
			throw Exceptions.wrapThrow(PotException.class, e);
		}
	}

	/**
	 * POJO类中的属性和数据库表中的字段对应列表。<br>
	 * 返回的Map的key是数据库表的字段名，value是POJO类的属性名。
	 * 
	 * @return
	 */
	public abstract Map<String, String> oppo();
}
